package 反射.获取类的构造器;

import java.lang.reflect.Constructor;

public class Test {
    public static void main(String[] args) throws Exception{
        // 获取类的构造器, 并对其进行操作
        // Class提供了从类中获取构造器的方法
        // 1. Constructor<?>[] getConstructor(): 获取全部构造器 (只能获取public修饰的)
        // 2. Constructor<?>[] getDeclaredConstructor(): 获取全部构造器 (只要存在就能拿到)
        // 3. Constructor<T> getConstructor(Class<?>... parameterTypes): 获取某个构造器 (只能获取public修饰的)
        // 4. Constructor<T> getDeclareConstructor(Class<?>... parameterTypes): 获取某个构造器 (只要存在就能拿到)

        // 1. 反射第一步, 必须先得到这个类的Class对象
        Class c = Cat.class;
        // 2. 获取类的全部构造器
        Constructor[] constructors1 = c.getConstructors();
        Constructor[] constructors2 = c.getDeclaredConstructors();
        // 3. 遍历数组中的每个构造器对象
        for (Constructor constructor : constructors1) {
            System.out.println(constructor.getName() + "参数有: " + constructor.getParameterCount() + "个");
        }// 这个不可以获取public以外修饰的构造器
        for (Constructor constructor : constructors2) {
            System.out.println(constructor.getName() + "参数有: " + constructor.getParameterCount() + "个");
        }// 这个可以获取任何存在的构造器

        // 获取某个无参构造器
        Constructor constructor = c.getConstructor(); //只能拿public修饰的构造器
        Constructor constructor1 = c.getDeclaredConstructor(); // 这个只要存在就可以拿到
        System.out.println(constructor.getName());
        System.out.println(constructor1.getName());

        // 获取某个有参构造器
        Constructor constructor2 = c.getConstructor(String.class, int.class); // 只能拿public修饰的构造器
        Constructor constructor3 = c.getDeclaredConstructor(String.class, int.class); // 都可以拿
        System.out.println(constructor2.getName());
        System.out.println(constructor3.getName());


    }
}
